home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / tools / exryg / exryg.s < prev    next >
Encoding:
Text File  |  1998-01-01  |  9.1 KB  |  455 lines

  1. *================================================================
  2. *    exryg.s
  3. *            Written by Igarashi
  4. *================================================================
  5.         .cpu    68000
  6. *================================================================
  7.         .include    doscall.mac
  8.         .include    iocscall.mac
  9. *================================================================
  10.         .offset    0
  11. verFDATE:    .ds.l    1
  12. verFLEN:    .ds.l    1
  13. verOFFSET:    .ds.l    1
  14. verREADLEN:    .ds.l    1
  15. verPATCH0:    .ds.l    1
  16. verPATCH1:    .ds.l    1
  17. SIZEofVERTBL:
  18.         .text
  19.  
  20. VERTBL        .macro    fdate,flen,offset,readlen,patchpos0,patchpos1
  21.         .dc.l    fdate,flen,offset+$40,readlen,patchpos0-offset,patchpos1-offset
  22.         .endm
  23.  
  24. *================================================================
  25.         .text
  26.         .even
  27. *================================================================
  28. entry:
  29.         bsr    memoff
  30.         bsr    chkarg
  31.         bsr    main
  32.         bsr    memfree
  33.         DOS    __EXIT
  34.  
  35. errorexit:
  36.         bsr    memfree
  37.         move.w    #1,-(sp)
  38.         DOS    __EXIT2
  39.  
  40. *================================================================
  41. memoff:
  42.         lea.l    16(a0),a0
  43.         suba.l    a0,a1
  44.         pea.l    (a1)
  45.         pea.l    (a0)
  46.         DOS    __SETBLOCK
  47.         addq.l    #8,sp
  48.         rts
  49.  
  50. *================================================================
  51. memfree:            *メモリブロック解放
  52.         move.l    bootxmem,d0
  53.         bsr    8f
  54.         move.l    sourmem,d0
  55.         bsr    8f
  56.         move.l    destmem,d0
  57. 8:        beq    @f
  58.         move.l    d0,-(sp)
  59.         DOS    __MFREE
  60.         addq.l    #4,sp
  61. @@:        rts
  62.  
  63. *================================================================
  64. main:                *メイン
  65.         bsr    makesourfn
  66.         bsr    makedestfn
  67.  
  68.         bsr    readbootx
  69.  
  70.         bsr    putsourmes
  71.         bsr    readsourfile
  72.  
  73.         bsr    putdestmes
  74.         bsr    expand
  75.  
  76.         bsr    putcompletemes
  77.  .ifdef CHKX
  78.         bsr    chkxfile
  79.         bne    @f
  80.         bsr    putxfilemes
  81.  .endif
  82. @@:        bsr    putcrlf
  83.  
  84.         rts
  85.  
  86. *================================================================
  87. getfileinfo:
  88.         move.w    #$0020,-(sp)    *ARCHIVE
  89.         pea.l    (a0)
  90.         pea.l    filesbuf(pc)
  91.         DOS    __FILES
  92.         lea.l    10(sp),sp
  93.         tst.l    d0
  94.         rts
  95.  
  96. *================================================================
  97. makesourfn:
  98.         lea.l    sourfnbuf(pc),a1
  99. @@:        tst.b    (a1)+
  100.         bne    @b
  101.         subq.l    #1,a1
  102.         lea.l    sourfnbuf+$43(pc),a0    *namNAME
  103. @@:        move.b    (a0)+,(a1)+
  104.         bne    @b
  105.         subq.l    #1,a1
  106.         lea.l    sourfnbuf+$56(pc),a0    *namEXT
  107. @@:        move.b    (a0)+,(a1)+
  108.         bne    @b
  109.         rts
  110.  
  111. *================================================================
  112. makedestfn:
  113.         lea.l    destfnbuf(pc),a1
  114.         lea.l    sourfnbuf+$43(pc),a0    *namNAME
  115. @@:        move.b    (a0)+,(a1)+
  116.         bne    @b
  117.         subq.l    #1,a1
  118.         lea.l    destext(pc),a0
  119. @@:        move.b    (a0)+,(a1)+
  120.         bne    @b
  121.         rts
  122.  
  123. *================================================================
  124. readsourfile:
  125.         lea.l    sourfnbuf(pc),a0
  126.         bsr    getfileinfo
  127.         bmi    nfoundsour
  128.  
  129.         move.l    filesbuf+$1a,d1    *FLEN
  130.  
  131.         move.l    d1,-(sp)
  132.         DOS    __MALLOC
  133. *        addq.l    #4,sp
  134.         tst.l    d0
  135.         bmi    nomemory
  136.         move.l    d0,sourmem
  137.         movea.l    d0,a0
  138.  
  139.         clr.w    -(sp)        *WOPEN
  140.         pea.l    sourfnbuf(pc)
  141.         DOS    __OPEN
  142. *        addq.l    #6,sp
  143.         move.l    d0,d2
  144.         bmi    cantopensour
  145.  
  146.         move.l    d1,-(sp)
  147.         pea.l    (a0)
  148.         move.w    d2,-(sp)
  149.         DOS    __READ
  150. *        lea.l    10(sp),sp
  151.  
  152.         move.w    d2,-(sp)
  153.         DOS    __CLOSE
  154. *        addq.l    #2,sp
  155.         lea.l    4+6+10+2(sp),sp
  156.  
  157.         subq.l    #5,d1
  158.         cmp.l    (a0),d1
  159.         bne    illformat
  160.  
  161.         rts
  162.  
  163. *================================================================
  164. readbootx:            *BOOT.X の読み込み
  165.         lea.l    bootxfn(pc),a0
  166.         bsr    getfileinfo
  167.         bmi    nfoundbootx
  168.  
  169.                 *バージョンチェック
  170.         lea.l    vertbl(pc),a0
  171.         bra    2f
  172. 1:        lea.l    SIZEofVERTBL(a0),a0
  173. 2:        move.l    verFDATE(a0),d0
  174.         beq    illversion
  175.         cmp.l    filesbuf+$16(pc),d0    *FTIME
  176.         bne    1b
  177.         move.l    verFLEN(a0),d0
  178.         cmp.l    filesbuf+$1a(pc),d0    *FLEN
  179.         bne    1b
  180.  
  181.                 *読み込み
  182.         move.l    verREADLEN(a0),-(sp)
  183.         DOS    __MALLOC
  184. *        addq.l    #4,sp
  185.         tst.l    d0
  186.         bmi    nomemory
  187.         move.l    d0,bootxmem
  188.         movea.l    d0,a1
  189.  
  190.         clr.w    -(sp)        *WOPEN
  191.         pea.l    bootxfn(pc)
  192.         DOS    __OPEN
  193. *        addq.l    #6,sp
  194.         move.l    d0,d1
  195.         bmi    cantopenbootx
  196.  
  197.         clr.w    -(sp)        *SEEK_SET
  198.         move.l    verOFFSET(a0),-(sp)
  199.         move.w    d1,-(sp)
  200.         DOS    __SEEK
  201. *        addq.l    #8,sp
  202.  
  203.         move.l    verREADLEN(a0),-(sp)
  204.         pea.l    (a1)
  205.         move.w    d1,-(sp)
  206.         DOS    __READ
  207. *        lea.l    10(sp),sp
  208.  
  209.         move.w    d1,-(sp)
  210.         DOS    __CLOSE
  211. *        addq.l    #2,sp
  212.         lea.l    4+6+8+10+2(sp),sp
  213.  
  214.                 *読み込んだプログラムにパッチを当てる
  215.  .if 0
  216.         move.l    verPATCH0(a0),d0
  217.         lea.l    0(a1,d0.l),a2    *a2 = パッチ位置
  218.         lea.l    patch0(pc),a3    *copy 3 word
  219.         move.l    (a2),(a3)+    *
  220.         move.w    4(a2),(a3)    *}
  221.         move.w    patch0_,(a2)+    *jmp.l
  222.         move.l    #patch0,(a2)+    *abs addr
  223.         move.l    a2,patch0_+2    *abs addr
  224.  .endif
  225.         move.l    verPATCH1(a0),d0
  226.         lea.l    0(a1,d0.l),a2    *a2 = パッチ位置
  227.         lea.l    patch1(pc),a3    *copy 3 word
  228.         move.l    (a2),(a3)+    *
  229.         move.w    4(a2),(a3)    *}
  230.         move.w    patch1_,(a2)+    *jmp.l
  231.         move.l    #patch1,(a2)+    *abs addr
  232.         move.l    a2,patch1_+2    *abs addr
  233.  
  234.                 *キャッシュフラッシュ
  235.         lea.l    $cbc.w,a1
  236.         IOCS    __B_BPEEK
  237.         tst.b    d0
  238.         beq    @f
  239.         moveq.l    #3,d1        *flush
  240.         moveq.l    #$ac,d0        *SYS_STAT
  241.         trap    #15
  242. @@:
  243.         rts
  244.  
  245. patch0:        .ds.w    3
  246. patch0_:    jmp    0.l    *2+4
  247.  
  248. patch1:        .ds.w    3
  249.         move.l    d0,destflen
  250. patch1_:    jmp    0.l    *2+4
  251.  
  252. *================================================================
  253. expand:
  254.         move.l    #$00ffffff,d1
  255.         move.l    d1,-(sp)
  256.         DOS    __MALLOC
  257. *        addq.l    #4,sp
  258.         and.l    d1,d0
  259.         move.l    d0,-(sp)
  260.         DOS    __MALLOC
  261. *        addq.l    #4,sp
  262.         tst.l    d0
  263.         bmi    nomemory
  264.         move.l    d0,destmem
  265.  
  266.         movea.l    d0,a0
  267.         movea.l    sourmem(pc),a1
  268.         movea.l    bootxmem(pc),a2
  269.         jsr    (a2)
  270.  
  271.         move.w    #$0020,-(sp)    *ARCHIVE
  272.         pea.l    destfnbuf(pc)
  273.         DOS    __CREATE
  274. *        addq.l    #6,sp
  275.         move.l    d0,d1
  276.         bmi    cantopendest
  277.  
  278.         move.l    destflen(pc),-(sp)
  279.         move.l    destmem(pc),-(sp)
  280.         move.w    d1,-(sp)
  281.         DOS    __WRITE
  282. *        lea.l    10(sp),sp
  283.  
  284.         move.w    d1,-(sp)
  285.         DOS    __CLOSE
  286. *        addq.l    #2,sp
  287.         lea.l    4+4+6+10+2(sp),sp
  288.  
  289.         rts
  290.  
  291. *================================================================
  292.  .ifdef CHKX
  293. chkxfile:            *いいかげんな *.x フォーマットチェック
  294.         movea.l    destmem(pc),a0
  295.         cmpi.w    #'HU',(a0)
  296.         rts
  297.  .endif
  298.  
  299. *================================================================
  300. chkarg:                *コマンドライン解析
  301.         addq.l    #1,a2
  302.  
  303. 1:        move.b    (a2)+,d0
  304.         beq    9f
  305.         cmpi.b    #' ',d0
  306.         beq    1b
  307.         cmpi.b    #'    ',d0
  308.         beq    1b
  309.  
  310.         cmpi.b    #'-',d0
  311.         beq    usage
  312.  
  313.         pea.l    sourfnbuf(pc)
  314.         pea.l    -1(a2)
  315.         DOS    __NAMECK
  316.         addq.l    #8,sp
  317.         tst.l    d0
  318.         bmi    illfname
  319.         tst.b    d0
  320.         bne    illfname
  321. 5:        move.b    (a2)+,d0
  322.         beq    9f
  323.         cmpi.b    #' ',d0
  324.         beq    1b
  325.         cmpi.b    #'    ',d0
  326.         bne    5b
  327.         bra    1b
  328.  
  329. 9:        tst.b    sourfnbuf+$00    *namDRIVE
  330.         beq    usage
  331.         rts
  332.  
  333. *================================================================
  334. putcompletemes:
  335.         lea.l    completemes(pc),a0
  336.         bra    putmes
  337. putsourmes:
  338.         lea.l    sourmes(pc),a0
  339.         bsr    putmes
  340.         lea.l    sourfnbuf(pc),a0
  341.         bsr    putmes
  342.         bra    putcrlf
  343. putdestmes:
  344.         lea.l    destmes(pc),a0
  345.         bsr    putmes
  346.         lea.l    destfnbuf(pc),a0
  347.         bsr    putmes
  348.         bra    putcrlf
  349.  .ifdef CHKX
  350. putxfilemes:
  351.         lea.l    xfilemes(pc),a0
  352.         bra    putmes
  353.  .endif
  354. putcrlf:
  355.         lea.l    crlfmes(pc),a0
  356. putmes:
  357.         pea.l    (a0)
  358.         DOS    __PRINT
  359.         addq.l    #4,sp
  360.         rts
  361.  
  362. *================================================================
  363. nfoundbootx:
  364.         lea.l    bootxfn(pc),a0
  365.         bsr    puterrmes
  366.         lea.l    nfoundmes(pc),a0
  367.         bsr    puterrmes
  368.         bra    errorexit
  369. nfoundsour:
  370.         lea.l    sourfnbuf(pc),a0
  371.         bsr    puterrmes
  372.         lea.l    nfoundmes(pc),a0
  373.         bsr    puterrmes
  374.         bra    errorexit
  375. nomemory:
  376.         lea.l    nomemmes(pc),a0
  377.         bsr    puterrmes
  378.         bra    errorexit
  379. illfname:
  380.         lea.l    illfnmes(pc),a0
  381.         bsr    puterrmes
  382.         bra    errorexit
  383. illformat:
  384.         lea.l    illfmtmes(pc),a0
  385.         bsr    puterrmes
  386.         bra    errorexit
  387. illversion:
  388.         lea.l    illvermes(pc),a0
  389.         bsr    puterrmes
  390.         bra    errorexit
  391. cantopensour:
  392.         lea.l    sourfnbuf(pc),a0
  393.         bra    cantopen
  394. cantopendest:
  395.         lea.l    destfnbuf(pc),a0
  396.         bra    cantopen
  397. cantopenbootx:
  398.         lea.l    bootxfn(pc),a0
  399. cantopen:
  400.         bsr    puterrmes
  401.         lea.l    cantopenmes(pc),a0
  402.         bsr    puterrmes
  403.         bra    errorexit
  404. usage:
  405.         lea.l    usgmes(pc),a0
  406.         bsr    puterrmes
  407.         bra    errorexit
  408. puterrmes:
  409.         move.w    #2,-(sp)    *STDERR
  410.         pea.l    (a0)
  411.         DOS    __FPUTS
  412.         addq.l    #6,sp
  413.         rts
  414.  
  415. *================================================================
  416. vertbl:        VERTBL    $BB8D1C8C,$0000B35A,$012a2,$001376-$0012a2,$0012a2,$00134c+2
  417.         .dc.l    0
  418.  
  419. usgmes:        .dc.b    'アルゴスの戦士 RYG file decomplessor '
  420.         .dc.b    'Copyright 1998 Igarashi',$0d,$0a
  421.         .dc.b    'usage:    exryg <filename.ext>'
  422. crlfmes:    .dc.b    $0d,$0a,0
  423. sourmes:    .dc.b    '入力ファイル ... ',0
  424. destmes:    .dc.b    '出力ファイル ... ',0
  425. completemes:    .dc.b    '終了しました.',0
  426.  .ifdef CHKX
  427. xfilemes:    .dc.b    ' 出力ファイルは *.x ファイルと思われます.',0
  428.  .endif
  429. nomemmes:    .dc.b    'メモリ不足です.',$0d,$0a,0
  430. illfnmes:    .dc.b    '不正なファイル名です.'
  431. illfmtmes:    .dc.b    'ファイルフォーマットが異常です.',$0d,$0a,0
  432. nfoundmes:    .dc.b    ' が見つかりません.',$0d,$0a,0
  433. cantopenmes:    .dc.b    ' がオープンできません.',$0d,$0a,0
  434. illvermes:    .dc.b    'BOOT.X のバージョンが違います.',$0d,$0a,0
  435.  
  436. destext:    .dc.b    '.bin',0
  437. bootxfn:    .dc.b    'BOOT.X',0
  438.  
  439. *================================================================
  440.         .bss
  441.         .even
  442. *================================================================
  443. bootxmem:    .ds.l    1    *メモリブロックアドレス (BOOT.X)
  444. sourmem:    .ds.l    1    *メモリブロックアドレス (入力ファイル)
  445. destmem:    .ds.l    1    *メモリブロックアドレス (出力ファイル)
  446. destmemend:    .ds.l    1    *destmem の終端アドレス
  447. destflen:    .ds.l    1    *出力ファイルのサイズ
  448. filesbuf:    .ds.b    53+1    *SIZEofFILESBUF
  449. sourfnbuf:    .ds.b    91+1    *SIZEofNAMECKBUF
  450. destfnbuf:    .ds.b    18+1+3+1
  451.  
  452. *================================================================
  453.         .end    entry
  454.  
  455.